package com.sdkx.wear_os.customview;

import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.animation.TranslateAnimation;

import androidx.recyclerview.widget.RecyclerView;

/**
 * 横向滑动阻尼
 */
public class StretchHorizontalRecyclerView extends RecyclerView {

    // 上次手势事件的x坐标
    private float mLastX;
    // 记录子View的正常位置
    private Rect normal = new Rect();

    public StretchHorizontalRecyclerView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onFinishInflate() {
        initView();
        super.onFinishInflate();
    }

    /**
     * 获取ScrollView的子布局
     */
    private void initView() {
        // 去除原本RecyclerView滚动到边界时的阴影效果
        setOverScrollMode(OVER_SCROLL_NEVER);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_UP:
                // 手指松开恢复
                if (!normal.isEmpty()) {
                    planAnimation();
                    normal.setEmpty();
                    mLastX = 0;
                }
                break;
            case MotionEvent.ACTION_MOVE:
                float currentX = ev.getX();
                // 滑动距离
                int distanceX = (int) (mLastX - currentX);

                // 处理X轴的滚动事件，当滚动到最上或者最下时需要移动布局
                // 手指刚触及屏幕时，也会触发此事件，此时mLastX的值还是0，会立即触发一个比较大的移动。这里过滤掉这种情况
                if (isNeedTranslate() && mLastX != 0) {
                    if (normal.isEmpty()) {
                        // 保存正常的布局位置
                        normal.set(getLeft(), getTop(), getRight(),
                                getBottom());
                    }
                    // 移动布局， 使distance / 2 防止平移过快
                    layout(getLeft() - distanceX / 2, getTop(),
                            getRight() - distanceX / 2, getBottom());
                }
                mLastX = currentX;
                break;
        }
        return super.onTouchEvent(ev);
    }

    /**
     * 回缩动画
     */
    public void planAnimation() {
        // 开启移动动画
        TranslateAnimation animation = new TranslateAnimation(getLeft(), normal.left,
                0, 0);
        animation.setDuration(200);
        startAnimation(animation);
        // 补间动画并不会真正修改innerView的位置，这里需要设置使得innerView回到正常的布局位置
        layout(normal.left, normal.top, normal.right, normal.bottom);
    }

    /**
     * 是否需要X移动布局
     */
    public boolean isNeedTranslate() {
        int offset = getMeasuredWidth() - getWidth();
        int scrollX = getScrollX();
        // 顶部或者底部
        return scrollX == 0 || scrollX == offset;
    }
}